package cn.org.rapid_framework.generator.ext.ant;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import org.apache.tools.ant.AntClassLoader;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.Path;
import org.apache.tools.ant.types.Reference;
import cn.org.rapid_framework.generator.GeneratorFacade;
import cn.org.rapid_framework.generator.GeneratorProperties;
import cn.org.rapid_framework.generator.ext.tableconfig.builder.TableConfigXmlBuilder;
import cn.org.rapid_framework.generator.ext.tableconfig.model.TableConfigSet;
import cn.org.rapid_framework.generator.util.SystemHelper;
public abstract class BaseGeneratorTask extends Task{
protected Path classpath;
protected String shareInput; //共享模板目录,可以使用classpath:前缀
protected String input; //模板输入目录,可以使用classpath:前缀
protected String output; //模板输出目录,可以使用classpath:前缀
private boolean openOutputDir = false;
private String _package;
public static Properties toProperties(Hashtable properties) {
Properties props = new Properties();
props.putAll(properties);
return props;
}
private void error(Exception e) {
StringWriter out = new StringWriter();
e.printStackTrace(new PrintWriter(out));
log(out.toString(),Project.MSG_ERR);
}
protected GeneratorFacade createGeneratorFacade(String input,String output) {
if(input == null) throw new IllegalArgumentException("input must be not null");
if(output == null) throw new IllegalArgumentException("output must be not null");
GeneratorProperties.setProperties(new Properties());
Properties properties = toProperties(getProject().getProperties());
properties.setProperty("basedir", getProject().getBaseDir().getAbsolutePath());
GeneratorProperties.setProperties(properties);
GeneratorFacade gf = new GeneratorFacade();
gf.getGenerator().addTemplateRootDir(input);
if(shareInput != null) {
gf.getGenerator().addTemplateRootDir(shareInput);
}
gf.getGenerator().setOutRootDir(output);
return gf;
}
public String getShareInput() {
return shareInput;
}
public void setShareInput(String shareInput) {
this.shareInput = shareInput;
}
public void setInput(String input) {
this.input = input;
}
public void setOutput(String output) {
this.output = output;
}
public void setOpenOutputDir(boolean openOutputDir) {
this.openOutputDir = openOutputDir;
}
public String getPackage() {
return _package;
}
public void setPackage(String _package) {
this._package = _package;
}
public void setClasspathRef(Reference r){
this.classpath = new Path(getProject());
this.classpath.setRefid(r);
}
@Override
final public void execute() throws BuildException {
super.execute();
setContextClassLoader();
try {
executeInternal();
}catch(Exception e) {
error(e);
throw new BuildException(e);
}
}
protected void executeInternal() throws Exception {
freemarker.log.Logger.selectLoggerLibrary(freemarker.log.Logger.LIBRARY_NONE);
executeBefore();
GeneratorFacade facade = createGeneratorFacade(input,output);
List<Map> maps = getGeneratorContexts();
if(maps == null) return;
for(Map map : maps) {
facade.generateByMap(map);
}
if(openOutputDir && SystemHelper.isWindowsOS) {
Runtime.getRuntime().exec("cmd.exe /c start "+output);
}
}
private void setContextClassLoader() {
if(classpath == null) {
String cp = ((AntClassLoader) getClass().getClassLoader()).getClasspath();
classpath = new Path(getProject(),cp);
}
AntClassLoader classloader = new AntClassLoader(getProject(),classpath,true);
Thread.currentThread().setContextClassLoader(classloader);
}
protected void executeBefore() throws Exception {
}
protected abstract List<Map> getGeneratorContexts() throws Exception;
}